package financeiro;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class Emprestimo {

    private static int ident = 0;
    
    private Integer       id;
    private String        tipo; // leasing, financiamento, emprestimo
    private List<Parcela> parcelas;

    private Integer numero; // numero do cliente
    private String  nome; // nome do cliente
    private String  cpf; // cpf do cliente

    private Emprestimo() { }


    private Emprestimo(int id, String tipo, List<Parcela> parcelas, int numero, String nome, String cpf) {
        this.id = id;
        this.tipo = tipo;
        this.parcelas = parcelas;
        this.numero = numero;
        this.nome = nome;
        this.cpf = cpf;
    }

    
    public static Emprestimo novoEmprestimo(double v, int p, int numero, String nome, String cpf) {
        double vf = v * Math.pow(1 + 0.06, p);        
        double vp = vf / p;
        List<Parcela> par = new ArrayList<Parcela>();
        Date da = new Date();
        int a = da.getYear();
        int m = da.getMonth();
        for (int i = 0; i < p; i++) {
            Parcela p1 = new Parcela();
            p1.setValor(vp);
            p1.setVencimento(new Date(a, m, 5));
            m++;
            if (m > 12) {
                m = 1;
                a++;
            }
            par.add(p1);
        }
        return new Emprestimo(++ident, "emprestimo", par, numero, nome, cpf);
    }

    public static Emprestimo novoEmprestimoAgendado(double v, int p, int a, int m, int d, int numero, String nome, String cpf) {
        double vf = v * Math.pow(1 + 0.06, p);
        double vp = vf / p;
        List<Parcela> par = new ArrayList<Parcela>();
        for (int i = 0; i < p; i++) {
            Parcela p1 = new Parcela();
            p1.setValor(vp);
            p1.setVencimento(new Date(a, m, d));
            m++;
            if (m > 12) {
                m = 1;
                a++;
            }
            par.add(p1);
        }
        return new Emprestimo(++ident, "emprestimo", par, numero, nome, cpf);
    }

    // vv = valor veiculo, novo = carro é zero, p = parcelas, ent = entrada, dv = dia vencimento
    public static Emprestimo novoFinanciamentoVeiculo(double vv, boolean novo, int p, double ent, int dv, int numero, String nome, String cpf) {
        double vf = (vv - ent) * Math.pow(1 + (novo ? 0.06 : 0.07), p);
        double vp = vf / p;
        List<Parcela> par = new ArrayList<Parcela>();
        Date da = new Date();
        int a = da.getYear();
        int m = da.getMonth();
        for (int i = 0; i < p; i++) {
            Parcela p1 = new Parcela();
            p1.setValor(vp);
            p1.setVencimento(new Date(a, m, dv));
            m++;
            if (m > 12) {
                m = 1;
                a++;
            }
            par.add(p1);
        }
        return new Emprestimo(++ident, "financiamento", par, numero, nome, cpf);
    }

    // vv = valor veiculo, p = parcelas, ent = entrada, dv = dia vencimento
    public static Emprestimo novoLeasingVeiculo(double vv, int p, double ent, int dv, int numero, String nome, String cpf) {
        double vf = (vv - ent) * Math.pow(1 + 0.05, p);
        double vp = vf / p;
        List<Parcela> par = new ArrayList<Parcela>();
        Date da = new Date();
        int a = da.getYear();
        int m = da.getMonth();
        for (int i = 0; i < p; i++) {
            Parcela p1 = new Parcela();
            p1.setValor(vp);
            p1.setVencimento(new Date(a, m, dv));
            m++;
            if (m > 12) {
                m = 1;
                a++;
            }
            par.add(p1);
        }
        return new Emprestimo(++ident, "leasing", par, numero, nome, cpf);
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getTipo() {
        return tipo;
    }

    public void setTipo(String tipo) {
        this.tipo = tipo;
    }

    public List<Parcela> getParcelas() {
        return parcelas;
    }

    public void pgPar(int n) { // paga uma parcela
        Parcela p = parcelas.get(n);
        p.setPago(true);
        if (tipo.equals("emprestimo")) {
            if (p.getVencimento().before(new Date())) {
                p.setValorPago(p.getValor());
            } else {
                p.setValorPago(p.getValor() * 0.01 + p.getValor());
            }
        } else if (tipo.equals("finaciamento")) {
            if (p.getVencimento().before(new Date())) {
                p.setValorPago(p.getValor());
            } else {
                p.setValorPago(p.getValor() * 0.02 + p.getValor());
            }
        } else if (tipo.equals("leasing")) {
            if (p.getVencimento().before(new Date())) {
                p.setValorPago(p.getValor());
            } else {
                p.setValorPago(p.getValor());
                parcelas.get(n + 1).setValor(parcelas.get(n + 1).getValor() * 0.1 + parcelas.get(n + 1).getValor());
            }
        }
    }

    public String getCpf() {
        return cpf;
    }

    public void setCpf(String cpf) {
        this.cpf = cpf;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public Integer getNumero() {
        return numero;
    }

    public void setNumero(Integer numero) {
        this.numero = numero;
    }


    
}
